1219 lines
42 KiB
C++
1219 lines
42 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FILE: timecycle/TimeCycle.h
|
|
// BY : Mark Nicholson
|
|
// FOR : Rockstar North
|
|
// ON : 19 Aug 2008
|
|
// WHAT:
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef TIMECYCLE_H
|
|
#define TIMECYCLE_H
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// INCLUDES
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// rage
|
|
#include "vectormath/vec4v.h"
|
|
#include "string/stringhash.h"
|
|
#include "timecycle/tcmanager.h"
|
|
|
|
// framework
|
|
#include "timecycle/tcconfig.h"
|
|
#include "timecycle/tckeyframe.h"
|
|
#include "fwscene/world/InteriorLocation.h"
|
|
#include "fwmaths/PortalCorners.h"
|
|
|
|
// game
|
|
#include "TimeCycleDebug.h"
|
|
#include "control/replay/ReplaySettings.h"
|
|
#include "Renderer/RenderThread.h"
|
|
#include "vfx/VisualEffects.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// DEFINES
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define TIMECYCLE_MAX_INTERIOR_MODIFIERS (20)
|
|
#define PLAYERSWITCH_FORCES_LIGHTDIR (0)
|
|
|
|
#define MAX_LOCAL_PORTAL (8)
|
|
|
|
struct CSkySettings;
|
|
|
|
#if __ASSERT
|
|
|
|
#define TC_ATSTRINGHASH(string,hash) ATSTRINGHASH(string,hash),string
|
|
|
|
#else
|
|
|
|
#define TC_ATSTRINGHASH(string,hash) ATSTRINGHASH(string,hash),NULL
|
|
|
|
#endif // __ASSERT
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// ENUMERATIONS
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if GTA_REPLAY
|
|
enum eTimeCyclePhase
|
|
{
|
|
TIME_CYCLE_PHASE_REPLAY_FREECAM = 0,
|
|
TIME_CYCLE_PHASE_REPLAY_NORMAL,
|
|
TIME_CYCLE_PHASE_GAME,
|
|
|
|
TIME_CYCLE_PHASE_MAX
|
|
};
|
|
#endif // GTA_REPLAY
|
|
|
|
enum TimeCycleVar_e
|
|
{
|
|
// light variables
|
|
TCVAR_LIGHT_DIR_COL_R = 0,
|
|
TCVAR_LIGHT_DIR_COL_G,
|
|
TCVAR_LIGHT_DIR_COL_B,
|
|
TCVAR_LIGHT_DIR_MULT,
|
|
|
|
TCVAR_LIGHT_DIRECTIONAL_AMB_COL_R,
|
|
TCVAR_LIGHT_DIRECTIONAL_AMB_COL_G,
|
|
TCVAR_LIGHT_DIRECTIONAL_AMB_COL_B,
|
|
TCVAR_LIGHT_DIRECTIONAL_AMB_INTENSITY,
|
|
TCVAR_LIGHT_DIRECTIONAL_AMB_INTENSITY_MULT,
|
|
TCVAR_LIGHT_DIRECTIONAL_AMB_BOUNCE_ENABLED,
|
|
|
|
TCVAR_LIGHT_AMB_DOWN_WRAP,
|
|
|
|
TCVAR_LIGHT_NATURAL_AMB_DOWN_COL_R,
|
|
TCVAR_LIGHT_NATURAL_AMB_DOWN_COL_G,
|
|
TCVAR_LIGHT_NATURAL_AMB_DOWN_COL_B,
|
|
TCVAR_LIGHT_NATURAL_AMB_DOWN_INTENSITY,
|
|
|
|
TCVAR_LIGHT_NATURAL_AMB_BASE_COL_R,
|
|
TCVAR_LIGHT_NATURAL_AMB_BASE_COL_G,
|
|
TCVAR_LIGHT_NATURAL_AMB_BASE_COL_B,
|
|
TCVAR_LIGHT_NATURAL_AMB_BASE_INTENSITY,
|
|
TCVAR_LIGHT_NATURAL_AMB_BASE_INTENSITY_MULT,
|
|
|
|
TCVAR_LIGHT_NATURAL_PUSH,
|
|
TCVAR_LIGHT_AMBIENT_BAKE_RAMP,
|
|
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R,
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G,
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B,
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY,
|
|
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R,
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G,
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B,
|
|
TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY,
|
|
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_COL_R,
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_COL_G,
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_COL_B,
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_INTENSITY,
|
|
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_COL_R,
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_COL_G,
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_COL_B,
|
|
TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_INTENSITY,
|
|
|
|
TCVAR_PED_LIGHT_COL_R,
|
|
TCVAR_PED_LIGHT_COL_G,
|
|
TCVAR_PED_LIGHT_COL_B,
|
|
TCVAR_PED_LIGHT_MULT,
|
|
TCVAR_PED_LIGHT_DIRECTION_X,
|
|
TCVAR_PED_LIGHT_DIRECTION_Y,
|
|
TCVAR_PED_LIGHT_DIRECTION_Z,
|
|
|
|
TCVAR_LIGHT_AMB_OCC_MULT,
|
|
TCVAR_LIGHT_AMB_OCC_MULT_PED,
|
|
TCVAR_LIGHT_AMB_OCC_MULT_VEH,
|
|
TCVAR_LIGHT_AMB_OCC_MULT_PROP,
|
|
TCVAR_LIGHT_AMB_VOLUMES_IN_DIFFUSE,
|
|
TCVAR_LIGHT_SSAO_INTEN,
|
|
TCVAR_LIGHT_SSAO_TYPE,
|
|
TCVAR_LIGHT_SSAO_CP_STRENGTH,
|
|
TCVAR_LIGHT_SSAO_QS_STRENGTH,
|
|
|
|
TCVAR_LIGHT_PED_RIM_MULT,
|
|
TCVAR_LIGHT_DYNAMIC_BAKE_TWEAK,
|
|
TCVAR_LIGHT_VEHICLE_SECOND_SPEC_OVERRIDE,
|
|
TCVAR_LIGHT_VEHICLE_INTENSITY_SCALE,
|
|
|
|
TCVAR_LIGHT_DIRECTION_OVERRIDE,
|
|
TCVAR_LIGHT_DIRECTION_OVERRIDE_OVERRIDES_SUN,
|
|
TCVAR_SUN_DIRECTION_X,
|
|
TCVAR_SUN_DIRECTION_Y,
|
|
TCVAR_SUN_DIRECTION_Z,
|
|
TCVAR_MOON_DIRECTION_X,
|
|
TCVAR_MOON_DIRECTION_Y,
|
|
TCVAR_MOON_DIRECTION_Z,
|
|
|
|
// light ray variables
|
|
TCVAR_LIGHT_RAY_COL_R,
|
|
TCVAR_LIGHT_RAY_COL_G,
|
|
TCVAR_LIGHT_RAY_COL_B,
|
|
TCVAR_LIGHT_RAY_MULT,
|
|
TCVAR_LIGHT_RAY_UNDERWATER_MULT,
|
|
TCVAR_LIGHT_RAY_DIST,
|
|
TCVAR_LIGHT_RAY_HEIGHTFALLOFF,
|
|
TCVAR_LIGHT_RAY_HEIGHTFALLOFFSTART,
|
|
|
|
TCVAR_LIGHT_RAY_ADD_REDUCER,
|
|
TCVAR_LIGHT_RAY_BLIT_SIZE,
|
|
TCVAR_LIGHT_RAY_RAY_LENGTH,
|
|
|
|
// post fx variables
|
|
TCVAR_POSTFX_EXPOSURE,
|
|
TCVAR_POSTFX_EXPOSURE_MIN,
|
|
TCVAR_POSTFX_EXPOSURE_MAX,
|
|
|
|
TCVAR_POSTFX_BRIGHT_PASS_THRESH_WIDTH,
|
|
TCVAR_POSTFX_BRIGHT_PASS_THRESH,
|
|
TCVAR_POSTFX_INTENSITY_BLOOM,
|
|
|
|
TCVAR_POSTFX_CORRECT_COL_R,
|
|
TCVAR_POSTFX_CORRECT_COL_G,
|
|
TCVAR_POSTFX_CORRECT_COL_B,
|
|
TCVAR_POSTFX_CORRECT_CUTOFF,
|
|
|
|
TCVAR_POSTFX_SHIFT_COL_R,
|
|
TCVAR_POSTFX_SHIFT_COL_G,
|
|
TCVAR_POSTFX_SHIFT_COL_B,
|
|
TCVAR_POSTFX_SHIFT_CUTOFF,
|
|
|
|
TCVAR_POSTFX_DESATURATION,
|
|
|
|
TCVAR_POSTFX_NOISE,
|
|
TCVAR_POSTFX_NOISE_SIZE,
|
|
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_EXPOSURE_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_A_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_B_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_C_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_D_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_E_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_F_DARK,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_W_DARK,
|
|
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_EXPOSURE_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_A_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_B_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_C_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_D_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_E_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_F_BRIGHT,
|
|
TCVAR_POSTFX_TONEMAP_FILMIC_W_BRIGHT,
|
|
|
|
// vignetting
|
|
TCVAR_POSTFX_VIGNETTING_INTENSITY,
|
|
TCVAR_POSTFX_VIGNETTING_RADIUS,
|
|
TCVAR_POSTFX_VIGNETTING_CONTRAST,
|
|
TCVAR_POSTFX_VIGNETTING_COL_R,
|
|
TCVAR_POSTFX_VIGNETTING_COL_G,
|
|
TCVAR_POSTFX_VIGNETTING_COL_B,
|
|
|
|
// colour gradient variables
|
|
TCVAR_POSTFX_GRAD_TOP_COL_R,
|
|
TCVAR_POSTFX_GRAD_TOP_COL_G,
|
|
TCVAR_POSTFX_GRAD_TOP_COL_B,
|
|
|
|
TCVAR_POSTFX_GRAD_MIDDLE_COL_R,
|
|
TCVAR_POSTFX_GRAD_MIDDLE_COL_G,
|
|
TCVAR_POSTFX_GRAD_MIDDLE_COL_B,
|
|
|
|
TCVAR_POSTFX_GRAD_BOTTOM_COL_R,
|
|
TCVAR_POSTFX_GRAD_BOTTOM_COL_G,
|
|
TCVAR_POSTFX_GRAD_BOTTOM_COL_B,
|
|
|
|
TCVAR_POSTFX_GRAD_MIDPOINT,
|
|
TCVAR_POSTFX_GRAD_TOP_MIDDLE_MIDPOINT,
|
|
TCVAR_POSTFX_GRAD_MIDDLE_BOTTOM_MIDPOINT,
|
|
|
|
// postfx scanline
|
|
TCVAR_POSTFX_SCANLINEINTENSITY,
|
|
TCVAR_POSTFX_SCANLINE_FREQUENCY_0,
|
|
TCVAR_POSTFX_SCANLINE_FREQUENCY_1,
|
|
TCVAR_POSTFX_SCANLINE_SPEED,
|
|
|
|
// postfx motion blur length
|
|
TCVAR_POSTFX_MOTIONBLUR_LENGTH,
|
|
|
|
// depth of field variables
|
|
TCVAR_DOF_FAR,
|
|
|
|
TCVAR_DOF_BLUR_MID,
|
|
TCVAR_DOF_BLUR_FAR,
|
|
TCVAR_DOF_ENABLE_HQDOF,
|
|
TCVAR_DOF_HQDOF_SMALLBLUR,
|
|
TCVAR_DOF_HQDOF_SHALLOWDOF,
|
|
TCVAR_DOF_HQDOF_NEARPLANE_OUT,
|
|
TCVAR_DOF_HQDOF_NEARPLANE_IN,
|
|
TCVAR_DOF_HQDOF_FARPLANE_OUT,
|
|
TCVAR_DOF_HQDOF_FARPLANE_IN,
|
|
|
|
TCVAR_ENV_BLUR_IN,
|
|
TCVAR_ENV_BLUR_OUT,
|
|
TCVAR_ENV_BLUR_SIZE,
|
|
|
|
TCVAR_BOKEH_BRIGHTNESS_MIN,
|
|
TCVAR_BOKEH_BRIGHTNESS_MAX,
|
|
TCVAR_BOKEH_FADE_MIN,
|
|
TCVAR_BOKEH_FADE_MAX,
|
|
|
|
// night vision variables
|
|
TCVAR_NV_LIGHT_DIR_MULT,
|
|
TCVAR_NV_LIGHT_AMB_DOWN_MULT,
|
|
TCVAR_NV_LIGHT_AMB_BASE_MULT,
|
|
|
|
TCVAR_NV_LOWLUM,
|
|
TCVAR_NV_HIGHLUM,
|
|
TCVAR_NV_TOPLUM,
|
|
|
|
TCVAR_NV_SCALERLUM,
|
|
|
|
TCVAR_NV_OFFSETLUM,
|
|
TCVAR_NV_OFFSETLOWLUM,
|
|
TCVAR_NV_OFFSETHIGHLUM,
|
|
|
|
TCVAR_NV_NOISELUM,
|
|
TCVAR_NV_NOISELOWLUM,
|
|
TCVAR_NV_NOISEHIGHLUM,
|
|
|
|
TCVAR_NV_BLOOMLUM,
|
|
|
|
TCVAR_NV_COLORLUM_R,
|
|
TCVAR_NV_COLORLUM_G,
|
|
TCVAR_NV_COLORLUM_B,
|
|
TCVAR_NV_COLORLOWLUM_R,
|
|
TCVAR_NV_COLORLOWLUM_G,
|
|
TCVAR_NV_COLORLOWLUM_B,
|
|
TCVAR_NV_COLORHIGHLUM_R,
|
|
TCVAR_NV_COLORHIGHLUM_G,
|
|
TCVAR_NV_COLORHIGHLUM_B,
|
|
|
|
// heat haze variables
|
|
TCVAR_HH_RANGESTART,
|
|
TCVAR_HH_RANGEEND,
|
|
TCVAR_HH_MININTENSITY,
|
|
TCVAR_HH_MAXINTENSITY,
|
|
TCVAR_HH_DISPU,
|
|
TCVAR_HH_DISPV,
|
|
TCVAR_HH_TEX1_USCALE,
|
|
TCVAR_HH_TEX1_VSCALE,
|
|
TCVAR_HH_TEX1_UOFFSET,
|
|
TCVAR_HH_TEX1_VOFFSET,
|
|
TCVAR_HH_TEX2_USCALE,
|
|
TCVAR_HH_TEX2_VSCALE,
|
|
TCVAR_HH_TEX2_UOFFSET,
|
|
TCVAR_HH_TEX2_VOFFSET,
|
|
TCVAR_HH_TEX1_OFFSET,
|
|
TCVAR_HH_TEX1_FREQUENCY,
|
|
TCVAR_HH_TEX1_AMPLITUDE,
|
|
TCVAR_HH_TEX1_SCROLLING,
|
|
TCVAR_HH_TEX2_OFFSET,
|
|
TCVAR_HH_TEX2_FREQUENCY,
|
|
TCVAR_HH_TEX2_AMPLITUDE,
|
|
TCVAR_HH_TEX2_SCROLLING,
|
|
|
|
// lens distortion
|
|
TCVAR_LENS_DISTORTION_COEFF,
|
|
TCVAR_LENS_DISTORTION_CUBE_COEFF,
|
|
TCVAR_LENS_CHROMATIC_ABERRATION_COEFF,
|
|
TCVAR_LENS_CHROMATIC_ABERRATION_CUBE_COEFF,
|
|
|
|
// lens artefacts
|
|
TCVAR_LENS_ARTEFACTS_INTENSITY,
|
|
TCVAR_LENS_ARTEFACTS_INTENSITY_MIN_EXP,
|
|
TCVAR_LENS_ARTEFACTS_INTENSITY_MAX_EXP,
|
|
|
|
// blur vignetting
|
|
TCVAR_BLUR_VIGNETTING_RADIUS,
|
|
TCVAR_BLUR_VIGNETTING_INTENSITY,
|
|
|
|
// screen blur
|
|
TCVAR_SCREEN_BLUR_INTENSITY,
|
|
|
|
// Sky variables
|
|
|
|
// Sky colouring
|
|
TCVAR_SKY_ZENITH_TRANSITION_POSITION,
|
|
TCVAR_SKY_ZENITH_TRANSITION_EAST_BLEND,
|
|
TCVAR_SKY_ZENITH_TRANSITION_WEST_BLEND,
|
|
|
|
TCVAR_SKY_ZENITH_BLEND_START,
|
|
|
|
TCVAR_SKY_ZENITH_COL_R,
|
|
TCVAR_SKY_ZENITH_COL_G,
|
|
TCVAR_SKY_ZENITH_COL_B,
|
|
TCVAR_SKY_ZENITH_COL_INTEN,
|
|
|
|
TCVAR_SKY_ZENITH_TRANSITION_COL_R,
|
|
TCVAR_SKY_ZENITH_TRANSITION_COL_G,
|
|
TCVAR_SKY_ZENITH_TRANSITION_COL_B,
|
|
TCVAR_SKY_ZENITH_TRANSITION_COL_INTEN,
|
|
|
|
TCVAR_SKY_AZIMUTH_TRANSITION_POSITION,
|
|
|
|
TCVAR_SKY_AZIMUTH_EAST_COL_R,
|
|
TCVAR_SKY_AZIMUTH_EAST_COL_G,
|
|
TCVAR_SKY_AZIMUTH_EAST_COL_B,
|
|
TCVAR_SKY_AZIMUTH_EAST_COL_INTEN,
|
|
|
|
TCVAR_SKY_AZIMUTH_TRANSITION_COL_R,
|
|
TCVAR_SKY_AZIMUTH_TRANSITION_COL_G,
|
|
TCVAR_SKY_AZIMUTH_TRANSITION_COL_B,
|
|
TCVAR_SKY_AZIMUTH_TRANSITION_COL_INTEN,
|
|
|
|
TCVAR_SKY_AZIMUTH_WEST_COL_R,
|
|
TCVAR_SKY_AZIMUTH_WEST_COL_G,
|
|
TCVAR_SKY_AZIMUTH_WEST_COL_B,
|
|
TCVAR_SKY_AZIMUTH_WEST_COL_INTEN,
|
|
|
|
TCVAR_SKY_HDR,
|
|
|
|
TCVAR_SKY_PLANE_COL_R,
|
|
TCVAR_SKY_PLANE_COL_G,
|
|
TCVAR_SKY_PLANE_COL_B,
|
|
TCVAR_SKY_PLANE_INTEN,
|
|
|
|
// Sun variables
|
|
TCVAR_SKY_SUN_COL_R,
|
|
TCVAR_SKY_SUN_COL_G,
|
|
TCVAR_SKY_SUN_COL_B,
|
|
|
|
TCVAR_SKY_SUN_DISC_COL_R,
|
|
TCVAR_SKY_SUN_DISC_COL_G,
|
|
TCVAR_SKY_SUN_DISC_COL_B,
|
|
|
|
TCVAR_SKY_SUN_DISC_SIZE,
|
|
|
|
TCVAR_SKY_SUN_HDR,
|
|
|
|
TCVAR_SKY_SUN_MIEPHASE,
|
|
TCVAR_SKY_SUN_MIESCATTER,
|
|
TCVAR_SKY_SUN_MIE_INTENSITY_MULT,
|
|
|
|
TCVAR_SKY_SUN_INFLUENCE_RADIUS,
|
|
TCVAR_SKY_SUN_SCATTER_INTEN,
|
|
|
|
// Stars / Moon variables
|
|
TCVAR_SKY_MOON_COL_R,
|
|
TCVAR_SKY_MOON_COL_G,
|
|
TCVAR_SKY_MOON_COL_B,
|
|
|
|
TCVAR_SKY_MOON_DISC_SIZE,
|
|
|
|
TCVAR_SKY_MOON_ITEN,
|
|
TCVAR_SKY_STARS_ITEN,
|
|
|
|
TCVAR_SKY_MOON_INFLUENCE_RADIUS,
|
|
TCVAR_SKY_MOON_SCATTER_INTEN,
|
|
|
|
// Cloud variables
|
|
|
|
// Cloud generation
|
|
TCVAR_SKY_CLOUD_GEN_FREQUENCY,
|
|
TCVAR_SKY_CLOUD_GEN_SCALE,
|
|
TCVAR_SKY_CLOUD_GEN_THRESHOLD,
|
|
TCVAR_SKY_CLOUD_GEN_SOFTNESS,
|
|
TCVAR_SKY_CLOUD_DENSITY_MULT,
|
|
TCVAR_SKY_CLOUD_DENSITY_BIAS,
|
|
|
|
// Main clouds
|
|
TCVAR_SKY_CLOUD_MID_COL_R,
|
|
TCVAR_SKY_CLOUD_MID_COL_G,
|
|
TCVAR_SKY_CLOUD_MID_COL_B,
|
|
|
|
TCVAR_SKY_CLOUD_BASE_COL_R,
|
|
TCVAR_SKY_CLOUD_BASE_COL_G,
|
|
TCVAR_SKY_CLOUD_BASE_COL_B,
|
|
|
|
TCVAR_SKY_CLOUD_BASE_STRENGTH,
|
|
|
|
TCVAR_SKY_CLOUD_SHADOW_COL_R,
|
|
TCVAR_SKY_CLOUD_SHADOW_COL_G,
|
|
TCVAR_SKY_CLOUD_SHADOW_COL_B,
|
|
|
|
TCVAR_SKY_CLOUD_SHADOW_STRENGTH,
|
|
TCVAR_SKY_CLOUD_GEN_DENSITY_OFFSET,
|
|
TCVAR_SKY_CLOUD_OFFSET,
|
|
|
|
TCVAR_SKY_CLOUD_OVERALL_STRENGTH,
|
|
TCVAR_SKY_CLOUD_OVERALL_COLOR,
|
|
TCVAR_SKY_CLOUD_EDGE_STRENGTH,
|
|
|
|
TCVAR_SKY_CLOUD_FADEOUT,
|
|
TCVAR_SKY_CLOUD_HDR,
|
|
TCVAR_SKY_CLOUD_DITHER_STRENGTH,
|
|
|
|
TCVAR_SKY_SMALL_CLOUD_COL_R,
|
|
TCVAR_SKY_SMALL_CLOUD_COL_G,
|
|
TCVAR_SKY_SMALL_CLOUD_COL_B,
|
|
|
|
TCVAR_SKY_SMALL_CLOUD_DETAIL_STRENGTH,
|
|
TCVAR_SKY_SMALL_CLOUD_DETAIL_SCALE,
|
|
TCVAR_SKY_SMALL_CLOUD_DENSITY_MULT,
|
|
TCVAR_SKY_SMALL_CLOUD_DENSITY_BIAS,
|
|
|
|
// cloud shadows
|
|
TCVAR_CLOUD_SHADOW_DENSITY,
|
|
TCVAR_CLOUD_SHADOW_SOFTNESS,
|
|
TCVAR_CLOUD_SHADOW_OPACITY,
|
|
|
|
// directional (cascade) shadows
|
|
TCVAR_DIRECTIONAL_SHADOW_NUM_CASCADES,
|
|
TCVAR_DIRECTIONAL_SHADOW_DISTANCE_MULTIPLIER,
|
|
TCVAR_DIRECTIONAL_SHADOW_SOFTNESS,
|
|
TCVAR_DIRECTIONAL_SHADOW_CASCADE0_SCALE,
|
|
|
|
// sprite (corona and distant lights) variables
|
|
TCVAR_SPRITE_BRIGHTNESS,
|
|
TCVAR_SPRITE_SIZE,
|
|
TCVAR_SPRITE_CORONA_SCREENSPACE_EXPANSION, // corona-only
|
|
TCVAR_LENSFLARE_VISIBILITY, // Lensflare
|
|
TCVAR_SPRITE_DISTANT_LIGHT_TWINKLE,
|
|
|
|
// water variables
|
|
TCVAR_WATER_REFLECTION_FIRST,
|
|
TCVAR_WATER_REFLECTION = TCVAR_WATER_REFLECTION_FIRST,
|
|
TCVAR_WATER_REFLECTION_FAR_CLIP,
|
|
TCVAR_WATER_REFLECTION_LOD,
|
|
TCVAR_WATER_REFLECTION_SKY_FLOD_RANGE,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_ENABLED,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_HD_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_HD_END,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_ORPHANHD_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_ORPHANHD_END,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_LOD_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_LOD_END,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD1_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD1_END,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD2_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD2_END,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD3_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD3_END,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD4_START,
|
|
TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD4_END,
|
|
TCVAR_WATER_REFLECTION_HEIGHT_OFFSET,
|
|
TCVAR_WATER_REFLECTION_HEIGHT_OVERRIDE,
|
|
TCVAR_WATER_REFLECTION_HEIGHT_OVERRIDE_AMOUNT,
|
|
TCVAR_WATER_REFLECTION_DISTANT_LIGHT_INTENSITY,
|
|
TCVAR_WATER_REFLECTION_CORONA_INTENSITY,
|
|
TCVAR_WATER_REFLECTION_LAST = TCVAR_WATER_REFLECTION_CORONA_INTENSITY,
|
|
|
|
TCVAR_WATER_FOGLIGHT,
|
|
TCVAR_WATER_INTERIOR,
|
|
TCVAR_WATER_ENABLEFOGSTREAMING,
|
|
TCVAR_WATER_FOAM_INTENSITY_MULT,
|
|
TCVAR_WATER_DRYING_SPEED_MULT,
|
|
TCVAR_WATER_SPECULAR_INTENSITY,
|
|
|
|
// mirror variables
|
|
TCVAR_MIRROR_REFLECTION_LOCAL_LIGHT_INTENSITY,
|
|
|
|
// fog variables
|
|
TCVAR_FOG_START,
|
|
TCVAR_FOG_NEAR_COL_R,
|
|
TCVAR_FOG_NEAR_COL_G,
|
|
TCVAR_FOG_NEAR_COL_B,
|
|
TCVAR_FOG_NEAR_COL_A,
|
|
|
|
TCVAR_FOG_SUN_COL_R,
|
|
TCVAR_FOG_SUN_COL_G,
|
|
TCVAR_FOG_SUN_COL_B,
|
|
TCVAR_FOG_SUN_COL_A,
|
|
TCVAR_FOG_SUN_LIGHTING_CALC_POW,
|
|
|
|
TCVAR_FOG_MOON_COL_R,
|
|
TCVAR_FOG_MOON_COL_G,
|
|
TCVAR_FOG_MOON_COL_B,
|
|
TCVAR_FOG_MOON_COL_A,
|
|
TCVAR_FOG_MOON_LIGHTING_CALC_POW,
|
|
|
|
TCVAR_FOG_FAR_COL_R,
|
|
TCVAR_FOG_FAR_COL_G,
|
|
TCVAR_FOG_FAR_COL_B,
|
|
TCVAR_FOG_FAR_COL_A,
|
|
|
|
TCVAR_FOG_DENSITY,
|
|
TCVAR_FOG_HEIGHT_FALLOFF,
|
|
TCVAR_FOG_BASE_HEIGHT,
|
|
TCVAR_FOG_ALPHA,
|
|
TCVAR_FOG_HORIZON_TINT_SCALE,
|
|
TCVAR_FOG_HDR,
|
|
|
|
TCVAR_FOG_HAZE_COL_R,
|
|
TCVAR_FOG_HAZE_COL_G,
|
|
TCVAR_FOG_HAZE_COL_B,
|
|
TCVAR_FOG_HAZE_DENSITY,
|
|
TCVAR_FOG_HAZE_ALPHA,
|
|
TCVAR_FOG_HAZE_HDR,
|
|
TCVAR_FOG_HAZE_START,
|
|
|
|
// Linear piecewise fog.
|
|
TCVAR_FOG_SHAPE_LOW, // Height of bottom of the interpolated shape.
|
|
TCVAR_FOG_SHAPE_HIGH, // Height of top of the interpolated shape.
|
|
TCVAR_FOG_LOG_10_MIN_VISIBILIY, // Log 10 of minimum visibility (i.e. distance you can see with fog at full thickness).
|
|
TCVAR_FOG_SHAPE_WEIGHT_0, // Weight 0.
|
|
TCVAR_FOG_SHAPE_WEIGHT_1, // Weight 1.
|
|
TCVAR_FOG_SHAPE_WEIGHT_2, // Weight 2.
|
|
TCVAR_FOG_SHAPE_WEIGHT_3, // Weight 3.
|
|
|
|
// fog shadows
|
|
TCVAR_FOG_SHADOW_AMOUNT, // maximum amount of fog shadow (below TCVAR_FOG_BASE_HEIGHT)
|
|
TCVAR_FOG_SHADOW_FALLOFF, // height above TCVAR_FOG_BASE_HEIGHT where fog shadow goes to zero
|
|
TCVAR_FOG_SHADOW_BASE_HEIGHT,
|
|
|
|
// volumetric lights,
|
|
TCVAR_FOG_VOLUME_RANGE,
|
|
TCVAR_FOG_VOLUME_FADE_RANGE,
|
|
TCVAR_FOG_VOLUME_INTENSITY_SCALE,
|
|
TCVAR_FOG_VOLUME_SIZE_SCALE,
|
|
|
|
// Fog ray
|
|
TCVAR_FOG_FOGRAY_CONTRAST,
|
|
TCVAR_FOG_FOGRAY_INTENSITY,
|
|
TCVAR_FOG_FOGRAY_DENSITY,
|
|
TCVAR_FOG_FOGRAY_NEARFADE,
|
|
TCVAR_FOG_FOGRAY_FARFADE,
|
|
|
|
// Reflection
|
|
TCVAR_REFLECTION_LOD_RANGE_START,
|
|
TCVAR_REFLECTION_LOD_RANGE_END,
|
|
TCVAR_REFLECTION_SLOD_RANGE_START,
|
|
TCVAR_REFLECTION_SLOD_RANGE_END,
|
|
TCVAR_REFLECTION_INTERIOR_RANGE,
|
|
TCVAR_REFLECTION_TWEAK_INTERIOR_AMB,
|
|
TCVAR_REFLECTION_TWEAK_EXTERIOR_AMB,
|
|
TCVAR_REFLECTION_TWEAK_EMISSIVE,
|
|
TCVAR_REFLECTION_TWEAK_DIRECTIONAL,
|
|
TCVAR_REFLECTION_HDR_MULT,
|
|
|
|
// misc variables
|
|
TCVAR_FAR_CLIP,
|
|
TCVAR_TEMPERATURE,
|
|
TCVAR_PTFX_EMISSIVE_INTENSITY_MULT,
|
|
TCVAR_VFXLIGHTNING_INTENSITY_MULT,
|
|
TCVAR_VFXLIGHTNING_VISIBILITY,
|
|
TCVAR_GPUPTFX_LIGHT_INTENSITY_MULT,
|
|
TCVAR_NATURAL_AMBIENT_MULTIPLIER,
|
|
TCVAR_ARTIFICIAL_INT_AMBIENT_MULTIPLIER,
|
|
TCVAR_FOG_CUT_OFF,
|
|
TCVAR_NO_WEATHER_FX,
|
|
TCVAR_NO_GPU_FX,
|
|
TCVAR_NO_RAIN,
|
|
TCVAR_NO_RAIN_RIPPLES,
|
|
TCVAR_FOGVOLUME_DENSITY_SCALAR,
|
|
TCVAR_FOGVOLUME_DENSITY_SCALAR_INTERIOR,
|
|
TCVAR_FOGVOLUME_FOG_SCALER,
|
|
TCVAR_TIME_OFFSET,
|
|
TCVAR_VEHICLE_DIRT_MOD,
|
|
TCVAR_WIND_SPEED_MULT,
|
|
TCVAR_ENTITY_REJECT,
|
|
TCVAR_LOD_MULT,
|
|
TCVAR_ENABLE_OCCLUSION,
|
|
TCVAR_ENABLE_SHADOW_OCCLUSION,
|
|
TCVAR_ENABLE_EXTERIOR,
|
|
TCVAR_PORTAL_WEIGHT,
|
|
|
|
TCVAR_LIGHT_FALLOFF_MULT,
|
|
TCVAR_LODLIGHT_RANGE_MULT,
|
|
TCVAR_SHADOW_DISTANCE_MULT,
|
|
|
|
TCVAR_LOD_MULT_HD,
|
|
TCVAR_LOD_MULT_ORPHANHD,
|
|
TCVAR_LOD_MULT_LOD,
|
|
TCVAR_LOD_MULT_SLOD1,
|
|
TCVAR_LOD_MULT_SLOD2,
|
|
TCVAR_LOD_MULT_SLOD3,
|
|
TCVAR_LOD_MULT_SLOD4,
|
|
|
|
// must be last
|
|
TCVAR_NUM // must match TIMECYCLE_VAR_COUNT in tckeyframe.h
|
|
};
|
|
|
|
CompileTimeAssert(TCVAR_NUM == TIMECYCLE_VAR_COUNT);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// EXTERNS
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
class CTimeCycle;
|
|
|
|
extern ALIGNAS(32) CTimeCycle g_timeCycle; // NB: CTimeCycle implicitly aligned to 32 bytes because of member frameInfo struct
|
|
extern tcVarInfo g_varInfos[];
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// CLASSES
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CTimeCycle ////////////////////////////////////////////////////////////////
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#define TCVALID_UPDATE() \
|
|
{\
|
|
Assertf(m_IsTimeCycleValid == true,"Using invalid Timecycle");\
|
|
Assert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE));\
|
|
}
|
|
|
|
#define TCVALID_RENDER() \
|
|
{\
|
|
Assert(CSystem::IsThisThreadId(SYS_THREAD_RENDER));\
|
|
}
|
|
|
|
class CTimeCycle : public tcManager
|
|
{
|
|
///////////////////////////////////
|
|
// FRIENDS
|
|
///////////////////////////////////
|
|
|
|
friend class CTimeCycleDebug;
|
|
friend class dlCmdSetupTimeCycleFrameInfo;
|
|
friend class dlCmdClearTimeCycleFrameInfo;
|
|
|
|
///////////////////////////////////
|
|
// FUNCTIONS
|
|
///////////////////////////////////
|
|
|
|
public: ///////////////////////////
|
|
class portalData
|
|
{
|
|
public:
|
|
void Reset()
|
|
{
|
|
screenArea = 0.0f;
|
|
mainModifierIdx = -1;
|
|
secondaryModifierIdx = -1;
|
|
inUse = false;
|
|
}
|
|
|
|
void SetCorners(const fwPortalCorners &c) { corners = c; }
|
|
const fwPortalCorners &GetCorners() const { return corners;}
|
|
|
|
void SetScreenArea(float sa) { screenArea = sa; }
|
|
float GetScreenArea() const { return screenArea;}
|
|
|
|
void SetDoorOcclusion(float doc) { doorOcclusion = doc; }
|
|
float GetDoorOcclusion() const { return doorOcclusion;}
|
|
|
|
void SetMainModifierIdx(int mi) { mainModifierIdx = mi; }
|
|
int GetMainModifierIdx() const { return mainModifierIdx;}
|
|
|
|
void SetSecondaryModifierIdx(int si) { secondaryModifierIdx = si; }
|
|
int GetSecondaryModifierIdx() const { return secondaryModifierIdx;}
|
|
|
|
void SetInUse(bool iu) { inUse = iu; }
|
|
bool GetInUse() const { return inUse;}
|
|
|
|
void SetExpandBox(bool eb) { expandBox = eb; }
|
|
bool GetExpandBox() const { return expandBox;}
|
|
|
|
private:
|
|
|
|
fwPortalCorners corners;
|
|
float screenArea;
|
|
float doorOcclusion;
|
|
int mainModifierIdx;
|
|
int secondaryModifierIdx;
|
|
bool inUse;
|
|
bool expandBox;
|
|
|
|
};
|
|
|
|
typedef atFixedArray<portalData, MAX_LOCAL_PORTAL> portalList;
|
|
|
|
struct ALIGNAS(32) frameInfo {
|
|
tcKeyframeUncompressed m_keyframe;
|
|
Vec4V m_vBaseDirectionalLight;
|
|
|
|
// sun info
|
|
Vec3V m_vSunSpriteDir;
|
|
Vec3V m_vMoonSpriteDir;
|
|
Vec3V m_vDirectionalLightDir;
|
|
float m_directionalLightIntensity;
|
|
float m_sunRollAngle;
|
|
float m_sunYawAngle;
|
|
float m_moonRollOffset;
|
|
float m_sunFade;
|
|
float m_moonFade;
|
|
float m_moonWobbleFrequency;
|
|
float m_moonWobbleAmplitude;
|
|
float m_moonWobbleOffset;
|
|
float m_moonCycleOverride;
|
|
double m_cycleTime;
|
|
|
|
// day night info
|
|
float m_dayNightBalance;
|
|
|
|
// Lod Scales
|
|
float m_GlobalLodScale;
|
|
float m_GrassLodScale;
|
|
|
|
Vec3V m_LightningDirection; // used only in overriding timecycle settings for lightning
|
|
bool m_LightningOverride; // used only in overriding timecycle settings for lightning
|
|
Color32 m_LightningColor; // used only in overriding timecycle settings for lightning
|
|
Color32 m_LightningFogColor; // used only in overriding timecycle settings for lightning
|
|
|
|
// Portals
|
|
portalList m_LocalPortalCache;
|
|
};
|
|
|
|
static void InitDLCCommands ();
|
|
void Init (unsigned initMode);
|
|
void Shutdown (unsigned shutdownMode);
|
|
void Update (bool finalUpdate);
|
|
static void UpdateWrapper() { g_timeCycle.Update(true); }
|
|
|
|
#if __ASSERT
|
|
void InvalidateTimeCycle () { m_IsTimeCycleValid = false; }
|
|
#endif // __ASSERT
|
|
#if TC_DEBUG
|
|
void InitLevelWidgets ();
|
|
void ShutdownLevelWidgets ();
|
|
void Render ();
|
|
#endif
|
|
|
|
static void SetShaderParams ();
|
|
void SetShaderData (CVisualEffects::eRenderMode mode = CVisualEffects::RM_DEFAULT);
|
|
|
|
void LoadModifierFiles ();
|
|
void AppendModifierFile (const char* filename);
|
|
void RevertModifierFile (const char* filename);
|
|
void LoadVisualSettings ();
|
|
|
|
// per entity ambient scale
|
|
Vec2V_Out CalcAmbientScale (Vec3V_In vPos, fwInteriorLocation intLoc);
|
|
|
|
// interior functions
|
|
bool CalcModifierAmbientScale (const int timeCycleIndex, const int secondaryTimeCycleIndex, float blend, float &natAmbientScale, float &artAmbientScale ASSERT_ONLY(, const atHashString timeCycleName, const atHashString secondaryTimeCycleName));
|
|
|
|
void AddLocalPortal(const fwPortalCorners &portal, float area, float doorOcclusion, int mainModifierIdx, int secondaryModifierIdx);
|
|
void PreSetInteriorAmbientCache(const atHashString name);
|
|
|
|
// script functions
|
|
void SetScriptModifierId (const atHashString name) {m_scriptModifierIndex = FindModifierIndex(name,"SetScriptModifierId"); m_transitionScriptModifierIndex = -1;}
|
|
void SetScriptModifierId (int index) {m_scriptModifierIndex = index; m_transitionScriptModifierIndex = -1;}
|
|
int GetScriptModifierIndex () {return m_scriptModifierIndex;}
|
|
int GetTransitionScriptModifierIndex() {return m_transitionScriptModifierIndex;}
|
|
|
|
void ClearScriptModifierId () {m_scriptModifierIndex = -1; m_transitionScriptModifierIndex = -1; m_scriptModifierStrength = 1.0f; m_transitionOut = false;}
|
|
void SetScriptModifierStrength (float strength) {m_scriptModifierStrength = strength; }
|
|
void PushScriptModifier();
|
|
void ClearPushedScriptModifier();
|
|
void PopScriptModifier();
|
|
|
|
void SetExtraModifierId (const atHashString name) {m_extraModifierIndex = FindModifierIndex(name,"SetExtraModifierId");}
|
|
void SetExtraModifierId (int index) {m_extraModifierIndex = index;}
|
|
int GetExtraModifierIndex () {return m_extraModifierIndex;}
|
|
void ClearExtraModifierId () {m_extraModifierIndex = -1;}
|
|
|
|
void SetTransitionToScriptModifierId(const atHashString name, float time);
|
|
void SetTransitionToScriptModifierId(int index, float time);
|
|
void SetTransitionOutOfScriptModifierId(float time);
|
|
|
|
bool GetIsTransitioningOut() const { return m_transitionOut; }
|
|
|
|
// player modifier
|
|
void SetPlayerModifierIdCurrent (const atHashString name) {m_playerModifierIndexCurrent = FindModifierIndex(name,"SetPlayerModifierIdCurrent");}
|
|
void SetPlayerModifierIdCurrent (int idx) {m_playerModifierIndexCurrent = idx;}
|
|
void SetPlayerModifierIdNext (const atHashString name) {m_playerModifierIndexNext = FindModifierIndex(name,"SetPlayerModifierIdNext");}
|
|
void SetPlayerModifierIdNext (int idx) {m_playerModifierIndexNext = idx;}
|
|
void SetPlayerModifierTransitionStrength(float f) {Assert((f>=0.0f)&&(f<=1.0f)); m_playerModifierStrength = f;}
|
|
|
|
int GetPlayerModifierIdCurrent () { return m_playerModifierIndexCurrent;}
|
|
int GetPlayerModifierIdNext () { return m_playerModifierIndexNext;}
|
|
float GetPlayerModifierTransitionStrength() { return m_playerModifierStrength; }
|
|
|
|
// default lighting
|
|
void SetUseDefaultKeyframe (const bool val) {m_useDefaultKeyframe = val;}
|
|
void SetLongShadowsEnabled (const bool val) {m_longShadowsEnabled = val;}
|
|
|
|
#if PLAYERSWITCH_FORCES_LIGHTDIR
|
|
// dir light override
|
|
void SetDirLightOverride(Vec3V_In light) { m_codeOverrideDirLightOrientation = light; }
|
|
void SetDirLightOverrideStrength(float strength) { m_codeOverrideDirLightOrientationStrength = strength; }
|
|
#endif // PLAYERSWITCH_FORCES_LIGHTDIR
|
|
|
|
// sky settings
|
|
void GetSkySettings (CSkySettings* pSkySettings);
|
|
void GetMinimalSkySettings (CSkySettings* pSkySettings);
|
|
void GetNoiseSkySettings (CSkySettings* pSkySettings);
|
|
|
|
// access functions
|
|
void SetupRenderThreadFrameInfo();
|
|
void ClearRenderFrameInfo();
|
|
|
|
//Lightning settigs
|
|
bool GetLightningOverrideRender () const { TCVALID_RENDER(); return m_currFrameInfo->m_LightningOverride; }
|
|
const Color32& GetLightningColorRender () const { TCVALID_RENDER(); return m_currFrameInfo->m_LightningColor; }
|
|
const Color32 GetLightningFogColorRender () const { TCVALID_RENDER(); return m_currFrameInfo->m_LightningFogColor; }
|
|
Vec3V_ConstRef GetLightningDirectionRender () const { TCVALID_RENDER(); return m_currFrameInfo->m_LightningDirection; }
|
|
|
|
bool GetLightningOverrideUpdate () const { TCVALID_UPDATE(); return m_frameInfo.m_LightningOverride; }
|
|
const Color32& GetLightningColorUpdate () const { TCVALID_UPDATE(); return m_frameInfo.m_LightningColor; }
|
|
const Color32 GetLightningFogColorUpdate () const { TCVALID_UPDATE(); return m_frameInfo.m_LightningFogColor; }
|
|
Vec3V_ConstRef GetLightningDirectionUpdate () const { TCVALID_UPDATE(); return m_frameInfo.m_LightningDirection; }
|
|
|
|
void SetLightningOverride (bool value) { m_frameInfo.m_LightningOverride = value; }
|
|
void SetLightningColor (const Color32& color) { m_frameInfo.m_LightningColor = color; }
|
|
void SetLightningFogColor (const Color32& color) { m_frameInfo.m_LightningFogColor = color; }
|
|
void SetLightningDirection (Vec3V_In direction) { m_frameInfo.m_LightningDirection = direction; }
|
|
|
|
|
|
// Prev frame access functions, because sometime, we don't care.
|
|
Vec4V_Out GetStaleBaseDirLight () const { return m_frameInfo.m_vBaseDirectionalLight; }
|
|
|
|
float GetStaleTemperature () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_TEMPERATURE); }
|
|
float GetStaleDirtModifier () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_VEHICLE_DIRT_MOD); }
|
|
float GetStaleNoWeatherFX () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_NO_WEATHER_FX); }
|
|
float GetStaleNoGpuFX () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_NO_GPU_FX); }
|
|
float GetStaleNoRain () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_NO_RAIN); }
|
|
float GetStaleNoRainRipples () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_NO_RAIN_RIPPLES); }
|
|
float GetStaleFogVolumeDensityScalar () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_FOGVOLUME_DENSITY_SCALAR); }
|
|
float GetStaleFogVolumeDensityScalarInterior() const { return m_frameInfo.m_keyframe.GetVar(TCVAR_FOGVOLUME_DENSITY_SCALAR_INTERIOR); }
|
|
float GetStaleFogVolumeFogScalar () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_FOGVOLUME_FOG_SCALER); }
|
|
float GetStaleFarClip () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_FAR_CLIP); }
|
|
float GetStaleInteriorBlendStrength () const { return m_interiorBlendStrength;}
|
|
float GetStaleEntityReject () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_ENTITY_REJECT) ; }
|
|
|
|
float GetStaleEnableOcclusion () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_ENABLE_OCCLUSION); }
|
|
float GetStaleEnableShadowOcclusion () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_ENABLE_SHADOW_OCCLUSION); }
|
|
float GetStaleRenderExterior () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_ENABLE_EXTERIOR); }
|
|
|
|
float GetStaleSpriteBrightness () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_SPRITE_BRIGHTNESS); }
|
|
float GetStaleSpriteSize () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_SPRITE_SIZE); }
|
|
|
|
float GetStaleWaterReflection () const { return m_frameInfo.m_keyframe.GetVar(TCVAR_WATER_REFLECTION); }
|
|
|
|
float GetStaleDayNightBalance () const { return m_frameInfo.m_dayNightBalance; }
|
|
|
|
const tcKeyframeUncompressed& GetCurrUpdateKeyframe () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe;}
|
|
Vec4V_ConstRef GetBaseDirLight () const {TCVALID_UPDATE(); return m_frameInfo.m_vBaseDirectionalLight;}
|
|
Vec3V_ConstRef GetDirectionalLightDirection() const {TCVALID_UPDATE(); return m_frameInfo.m_vDirectionalLightDir;}
|
|
float GetDirectionalLightIntensity() const {TCVALID_UPDATE(); return m_frameInfo.m_directionalLightIntensity;}
|
|
Vec3V_ConstRef GetSunSpriteDirection () const {TCVALID_UPDATE(); return m_frameInfo.m_vSunSpriteDir;}
|
|
Vec3V_ConstRef GetMoonSpriteDirection () const {TCVALID_UPDATE(); return m_frameInfo.m_vMoonSpriteDir;}
|
|
|
|
float GetSunRollAngle () const {TCVALID_UPDATE(); return m_frameInfo.m_sunRollAngle;}
|
|
float GetSunYawAngle () const {TCVALID_UPDATE(); return m_frameInfo.m_sunYawAngle;}
|
|
float GetMoonRollOffset () const {TCVALID_UPDATE(); return m_frameInfo.m_moonRollOffset;}
|
|
float GetDayNightBalance () const {TCVALID_UPDATE(); return m_frameInfo.m_dayNightBalance;}
|
|
float GetMoonWobbleFrequency () const {TCVALID_UPDATE(); return m_frameInfo.m_moonWobbleFrequency;}
|
|
float GetMoonWobbleAmplitude () const {TCVALID_UPDATE(); return m_frameInfo.m_moonWobbleAmplitude;}
|
|
float GetMoonWobbleOffset () const {TCVALID_UPDATE(); return m_frameInfo.m_moonWobbleOffset;}
|
|
float GetMoonCycleOverride () const {TCVALID_UPDATE(); return m_frameInfo.m_moonCycleOverride;}
|
|
float GetSunFade () const {TCVALID_UPDATE(); return m_frameInfo.m_sunFade;}
|
|
float GetMoonFade () const {TCVALID_UPDATE(); return m_frameInfo.m_moonFade;}
|
|
double GetCycleTime () const {TCVALID_UPDATE(); return m_frameInfo.m_cycleTime;}
|
|
float GetLodMult () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT); }
|
|
float GetLodScale_Hd () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_HD); }
|
|
float GetLodScale_OrphanHd () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_ORPHANHD); }
|
|
float GetLodScale_Lod () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_LOD); }
|
|
float GetLodScale_Slod1 () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_SLOD1); }
|
|
float GetLodScale_Slod2 () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_SLOD2); }
|
|
float GetLodScale_Slod3 () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_SLOD3); }
|
|
float GetLodScale_Slod4 () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LOD_MULT_SLOD4); }
|
|
float GetDirectionalLightMult () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_MULT); }
|
|
float GetMotionBlurLength () const {TCVALID_UPDATE(); return m_frameInfo.m_keyframe.GetVar(TCVAR_POSTFX_MOTIONBLUR_LENGTH); }
|
|
void SetSunRollAngle (float roll) {m_frameInfo.m_sunRollAngle = roll;}
|
|
void SetSunYawAngle (float yaw) {m_frameInfo.m_sunYawAngle = yaw;}
|
|
void SetMoonRollOffset (float offset) {m_frameInfo.m_moonRollOffset = offset;}
|
|
void SetMoonWobbleFrequency (float freq) {m_frameInfo.m_moonWobbleFrequency = freq;}
|
|
void SetMoonWobbleAmplitude (float amp) {m_frameInfo.m_moonWobbleAmplitude = amp;}
|
|
void SetMoonWobbleOffset (float offset) {m_frameInfo.m_moonWobbleOffset = offset;}
|
|
void SetMoonCycleOverride (float amount) {m_frameInfo.m_moonCycleOverride = amount;}
|
|
void SetCycleTime (double time) {m_frameInfo.m_cycleTime = time;}
|
|
|
|
void SetDayNightBalance (float balance) {m_frameInfo.m_dayNightBalance = balance;}
|
|
|
|
const tcKeyframeUncompressed& GetCurrRenderKeyframe () const {TCVALID_RENDER(); return m_currFrameInfo->m_keyframe;}
|
|
Vec4V_ConstRef GetCurrBaseDirLight () const {TCVALID_RENDER(); return m_currFrameInfo->m_vBaseDirectionalLight;}
|
|
float GetCurrSunFade () const {TCVALID_RENDER(); return m_currFrameInfo->m_sunFade;}
|
|
float GetCurrMoonFade () const {TCVALID_RENDER(); return m_currFrameInfo->m_moonFade;}
|
|
Vec3V_ConstRef GetCurrMoonSpriteDirection () const {TCVALID_RENDER(); return m_currFrameInfo->m_vMoonSpriteDir;}
|
|
Vec3V_ConstRef GetCurrSunSpriteDirection () const {TCVALID_RENDER(); return m_currFrameInfo->m_vSunSpriteDir;}
|
|
float GetCurrDayNightBalance () const {TCVALID_RENDER(); return m_currFrameInfo->m_dayNightBalance;}
|
|
float GetCurrMoonCycleOverride () const {TCVALID_RENDER(); return m_currFrameInfo->m_moonCycleOverride;}
|
|
double GetCurrCycleTime () const {TCVALID_RENDER(); return m_currFrameInfo->m_cycleTime;}
|
|
const portalList& GetLocalPortalList () const {TCVALID_RENDER(); return m_currFrameInfo->m_LocalPortalCache;}
|
|
float GetCurrNoGpuFX () const {TCVALID_RENDER(); return m_currFrameInfo->m_keyframe.GetVar(TCVAR_NO_GPU_FX); }
|
|
|
|
float CalculateDayNightBalance () const;
|
|
|
|
void ResetRegionInfo () {m_numRegions = 0;}
|
|
void AddRegionInfo (const char* regionName) {BANK_ONLY(strcpy(m_regionInfo[m_numRegions].name, regionName);) m_regionInfo[m_numRegions].hashName = atStringHash(regionName); m_numRegions++;}
|
|
void SetRegionOverride (s32 region) {Assert(region < m_numRegions); m_regionOverride = region;}
|
|
int GetRegionOverride () { return m_regionOverride; }
|
|
|
|
#if GTA_REPLAY
|
|
|
|
struct TCNameAndValue
|
|
{
|
|
u32 nameHash;
|
|
float value;
|
|
};
|
|
|
|
u32 GetReplayModifierHash () { return m_ReplayModifierHash; }
|
|
void SetReplayModifierHash (u32 const modifierHash, float const intensity )
|
|
{
|
|
m_ReplayModifierHash = modifierHash;
|
|
m_ReplayModifierIntensity = intensity;
|
|
}
|
|
|
|
|
|
u32 GetTimeCycleKeyframeData(TCNameAndValue *pData, bool getDefaultData = false);
|
|
void SetTimeCycleKeyframeData(const TCNameAndValue *pData, u32 count, bool isSniperScope, bool isDefaultData = false);
|
|
|
|
// Check if replay is active
|
|
bool ShouldUseReplayTCData();
|
|
bool ShouldApplyInteriorModifier() const;
|
|
bool ShouldDisableScripFxForFreeCam(u32 scriptFx, u32 transistionFx) const;
|
|
bool ShouldDisableScripFxForGameCam(u32 scriptFx, u32 transistionFx) const;
|
|
|
|
void RecordTimeCycleDataForReplay(eTimeCyclePhase timeCyclePhase);
|
|
|
|
void EnableReplayExtraEffects () { m_bReplayEnableExtraFX = true; }
|
|
void DisableReplayExtraEffects () { m_bReplayEnableExtraFX = false; }
|
|
bool AreReplayExtraEffectsEnabled() const { return m_bReplayEnableExtraFX; }
|
|
|
|
void SetReplaySaturationIntensity(float intensity) { m_ReplaySaturationIntensity = intensity; }
|
|
void SetReplayVignetteIntensity (float intensity) { m_ReplayVignetteIntensity = intensity; }
|
|
void SetReplayContrastIntensity (float intensity) { m_ReplayContrastIntensity = intensity; }
|
|
void SetReplayBrightnessIntensity(float intensity) { m_ReplayBrightnessIntensity = intensity; }
|
|
|
|
float GetReplaySaturationIntensity() const { return m_ReplaySaturationIntensity; }
|
|
float GetReplayVignetteIntensity () const { return m_ReplayVignetteIntensity; }
|
|
float GetReplayContrastIntensity () const { return m_ReplayContrastIntensity; }
|
|
float GetReplayBrightnessIntensity() const { return m_ReplayBrightnessIntensity; }
|
|
float GetReplayEffectIntensity() const { return m_ReplayModifierIntensity; }
|
|
|
|
#endif //GTA_REPLAY
|
|
// access functions - debug
|
|
#if TC_DEBUG
|
|
inline const CTimeCycleDebug& GetGameDebug () const {return m_gameDebug;}
|
|
inline CTimeCycleDebug& GetGameDebug () {return m_gameDebug;}
|
|
#endif // TC_DEBUG
|
|
|
|
// access functions - visual settings - should not be part of this class
|
|
inline float GetSpecularOffset () const {return m_vsSpecularOffset;} // used only in lights.cpp
|
|
#if __ASSERT
|
|
bool CanAccess () const { return m_IsTimeCycleValid; }
|
|
#endif
|
|
private: ///////////////////////////
|
|
|
|
// keyframe calculation functions
|
|
void CalcBaseKeyframe (tcKeyframeUncompressed& baseKeyframe, const u32 hours, const u32 minutes, const u32 seconds, const u32 prevCycleHashName, const u32 nextCycleHashName, const float cycleInterp);
|
|
void UpdateUnderWater (tcKeyframeUncompressed& keyframe, const u32 hours, const u32 minutes, const u32 seconds);
|
|
void CalcSunLightDir ();
|
|
void CalcDirectionalLightandPos (Vec3V_InOut vDirectionalDir, float &directionalInten, Vec3V_InOut vSunDir, Vec3V_InOut vMoonDir, float hours, float sunSlope, float moonSlope, float sunYaw, float &sunFade, float &moonFade);
|
|
void ApplyCutsceneModifiers (tcKeyframeUncompressed& keyframe);
|
|
void ApplyCutsceneCameraOverrides(tcKeyframeUncompressed& keyframe);
|
|
void ApplyBoxModifiers (tcKeyframeUncompressed& keyframe, float alpha, bool interiorOnly, bool underWaterOnly);
|
|
void ApplyUnderwaterModifiers (tcKeyframeUncompressed& keyframe);
|
|
bool ApplyInteriorModifiers (tcKeyframeUncompressed& keyframe, bool isUnderWater, bool finalUpdate);
|
|
void ApplyGlobalModifiers (tcKeyframeUncompressed& keyframe, const bool finalUpdate REPLAY_ONLY(, const eTimeCyclePhase replayPass));
|
|
void ApplyLodScaleModifiers (WIN32PC_ONLY(tcKeyframeUncompressed& keyframe));
|
|
#if GTA_REPLAY
|
|
void ApplyReplayEditorModifiers (tcKeyframeUncompressed& keyframe);
|
|
void ApplyReplayExtraEffects (tcKeyframeUncompressed& keyframe);
|
|
void ApplyModifierWithNegativeRange (tcKeyframeUncompressed& keyframe, const tcModifier *negMod, const tcModifier *posMod, float alpha, bool linearize);
|
|
#endif //GTA_REPLAY
|
|
void ApplyVisualSettings (tcKeyframeUncompressed& keyframe, Vec3V_In vCameraPos) const;
|
|
Vec2V_Out GetModifierAmbientScale (const tcModifier *mod, bool &validNat, bool &validArt);
|
|
Vec2V_Out GetModifierAmbientScaleWithDefault (const tcModifier *mod);
|
|
|
|
void SetInteriorCache(int mainTcIdx, int secondaryTcIdx);
|
|
|
|
///////////////////////////////////
|
|
// VARIABLES
|
|
///////////////////////////////////
|
|
|
|
private: //////////////////////////
|
|
|
|
#if GTA_REPLAY
|
|
struct EffectTableEntry
|
|
{
|
|
atHashString m_Name;
|
|
|
|
const bool operator == (const u32 & hash) const
|
|
{
|
|
return m_Name.GetHash() == hash;
|
|
}
|
|
};
|
|
|
|
bool m_bReplaySniperScope;
|
|
tcKeyframeUncompressed m_ReplayTCFrame; // Dual function:-
|
|
// In recording, is used to store the last keyframe that didn't have a weaponwheel or character select PostFX on it.
|
|
// In playback, is used to store the data coming back out of the replay packet data.
|
|
|
|
tcKeyframeUncompressed m_ReplayDefaultTCFrame; //Used to store tc data with out specified fx
|
|
bool m_bUsingDefaultTCData; //Is the default data currently applied
|
|
|
|
u32 m_ReplayModifierHash;
|
|
float m_ReplayModifierIntensity;
|
|
|
|
bool m_bReplayEnableExtraFX;
|
|
float m_ReplaySaturationIntensity;
|
|
float m_ReplayVignetteIntensity;
|
|
float m_ReplayContrastIntensity;
|
|
float m_ReplayBrightnessIntensity;
|
|
|
|
static EffectTableEntry m_InteriorReplayLookupTable[];
|
|
|
|
static EffectTableEntry m_ScriptEffectFreeCamRemovalReplayLookupTable[];
|
|
static EffectTableEntry m_ScriptEffectAllCamsRemovalReplayLookupTable[];
|
|
|
|
atMap<u32,u16> m_EffectsMap;
|
|
|
|
tcKeyframeUncompressed g_KeyframeCachedForReplayJump;
|
|
#endif
|
|
|
|
frameInfo m_frameInfo;
|
|
static frameInfo *m_currFrameInfo;
|
|
|
|
// region info
|
|
s32 m_numRegions;
|
|
s32 m_regionOverride;
|
|
tcRegionInfo m_regionInfo [TIMECYCLE_MAX_REGIONS];
|
|
|
|
// modifier overrides
|
|
s32 m_scriptModifierIndex;
|
|
float m_scriptModifierStrength;
|
|
s32 m_transitionScriptModifierIndex;
|
|
float m_transitionStrength;
|
|
float m_transitionSpeed;
|
|
bool m_transitionOut;
|
|
|
|
s32 m_pushedScriptModifierIndex;
|
|
s32 m_pushedTransitionScriptModifierIndex;
|
|
float m_pushedTransitionStrength;
|
|
float m_pushedTransitionSpeed;
|
|
bool m_pushedTransitionOut;
|
|
bool m_pushedScriptModifier;
|
|
|
|
// extra modifier
|
|
s32 m_extraModifierIndex;
|
|
|
|
// player specific modifiers.
|
|
s32 m_playerModifierIndexCurrent;
|
|
s32 m_playerModifierIndexNext;
|
|
float m_playerModifierStrength;
|
|
|
|
// Cutscene
|
|
s32 m_cutsceneModifierIndex;
|
|
|
|
// interiors
|
|
float m_interiorBlendStrength;
|
|
bool m_interiorInitialised;
|
|
bool m_interiorApply;
|
|
bool m_interiorReset;
|
|
float m_interior_down_color_r;
|
|
float m_interior_down_color_g;
|
|
float m_interior_down_color_b;
|
|
float m_interior_down_intensity;
|
|
s32 m_interior_main_idx;
|
|
|
|
float m_interior_up_color_r;
|
|
float m_interior_up_color_g;
|
|
float m_interior_up_color_b;
|
|
float m_interior_up_intensity;
|
|
s32 m_interior_secondary_idx;
|
|
|
|
// flags
|
|
bool m_useDefaultKeyframe;
|
|
static bool m_longShadowsEnabled;
|
|
|
|
#if PLAYERSWITCH_FORCES_LIGHTDIR
|
|
// Code side directional light override
|
|
Vec3V m_codeOverrideDirLightOrientation;
|
|
float m_codeOverrideDirLightOrientationStrength;
|
|
#endif // PLAYERSWITCH_FORCES_LIGHTDIR
|
|
|
|
// visual settings
|
|
float m_vsFarClipMultiplier;
|
|
float m_vsNearFogMultiplier;
|
|
float m_vsMultiplierHeightStart;
|
|
float m_vsOoMultiplierRange;
|
|
float m_vsRimLight;
|
|
float m_vsGlobalEnvironmentReflection;
|
|
float m_vsGamma;
|
|
float m_vsMidBlur;
|
|
float m_vsFarBlur;
|
|
float m_vsSkyMultiplier;
|
|
float m_vsDesaturation;
|
|
float m_vsDOFblurScale;
|
|
float m_vsCutsceneNearBlurMin;
|
|
float m_vsMoonDimMult;
|
|
float m_vsNextGenModifer;
|
|
|
|
// visual settings - should not be part of this class
|
|
float m_vsSpecularOffset; // used only in lights.cpp
|
|
|
|
|
|
#if __ASSERT
|
|
bool m_IsTimeCycleValid;
|
|
#endif // __ASSERT
|
|
// debug
|
|
#if TC_DEBUG
|
|
CTimeCycleDebug m_gameDebug;
|
|
#endif
|
|
|
|
};
|
|
|
|
// wrapper class needed to interface with game skeleton code
|
|
// class CTimeCycleWrapper
|
|
// {
|
|
// public:
|
|
//
|
|
// static void Init(unsigned initMode);
|
|
// };
|
|
|
|
|
|
class ShadowFreezing
|
|
{
|
|
|
|
Vector3 m_PrimaryShadowLightDir;
|
|
Vector3 m_PrevCamPos;
|
|
Vector3 m_PrevPlayerPos;
|
|
Vector3 m_PlayerPos;
|
|
float m_CameraRotationCatchupScale;
|
|
float m_CameraTranslationCatchupScale;
|
|
float m_CameraMovementCatcupScale;
|
|
float m_MaxAngleOffset;
|
|
float m_AngleMovementAcceleration;
|
|
float m_PrevAngleMovement;
|
|
bool m_PlayerActive;
|
|
bool m_firstFrame;
|
|
float m_prevHeading;
|
|
bool m_inited;
|
|
bool m_isEnabled;
|
|
BANK_ONLY(bool m_isCurrentlyFrozen;)
|
|
public:
|
|
ShadowFreezing();
|
|
|
|
inline bool IsEnabled() const
|
|
{
|
|
return m_isEnabled;
|
|
}
|
|
|
|
inline bool SetEnabled(bool bEnabled)
|
|
{
|
|
return m_isEnabled = bEnabled;
|
|
}
|
|
|
|
Vec3V_Out Update(const Vector3& trueLightDir, const Vector3& camPos, bool isCut, float heading, const Vector3& playerP, bool playerActive, bool iscutscene);
|
|
#if __BANK
|
|
void AddWidgets(bkBank & bank);
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
#endif // TIMECYCLE_H
|
|
|
|
|
|
|